#include "uart_hal.h"
//#define UART_TEST
#ifdef UART_TEST
#include <stdio.h>
static void uart_delay(void)
{
	int i = 0;
	for(i=0;i<0xfffff;i++);
}
static void uart_test(void)
{
	while(1)
	{
	
		UART1_SendByte(0xaa);
		UART1_SendByte(0xbb);
		UART1_SendByte(0xcc);
		UART1_SendByte(0xdd);
		UART1_SendByte(0xee);
			uart_delay();
	}
}

#endif 

u8 UART_Flag = 1; //UART发送完成标志位




/**
 * @brief 发送一个字节
 * 
 * @param ch 
 */
void UART1_SendByte(uint8_t ch)
{
   UART_Flag = 1;
   UART1->BUFF = ch;
	 while(UART_Flag);
}


/**
 * @brief 发送8位的数组
 * 
 * @param array 发送数组指针
 * @param num   发送长度
 */
void UART1_SendArray(uint8_t *array, uint16_t num)
{
  uint8_t i;
	UART_Flag = 1;
	for(i=0; i<num; i++)
  {
	    /* 发送一个字节数据到USART */
		   UART_Flag = 1;
	     UART1->BUFF = array[i];	
		   while(UART_Flag);
  }
}

/**
 * @brief 发送字符串
 * 
 * @param str 
 */
void Usart_SendString(char *str)
{
	unsigned int k=0;
  do 
  {
		   UART_Flag = 1;
       UART1->BUFF = *(str + k);
       k++;
		   while(UART_Flag);//判断发送是否完成
  } while(*(str + k)!='\0');
  
 
}

/**
 * @brief 发送一个16位数
 * 
 * @param ch 
 */
void Usart_SendHalfWord( uint16_t ch)
{
	uint8_t temp_h, temp_l;
	
	/* 取出高八位 */
	temp_h = (ch&0XFF00)>>8;
	/* 取出低八位 */
	temp_l = ch&0XFF;
	
	/* 发送高八位 */
	UART_Flag = 1;
	UART1_SendByte(temp_h);	
	while(UART_Flag);
	
	/* 发送低八位 */
	UART_Flag = 1;
	UART1_SendByte(temp_l);	
	while(UART_Flag);	
}


/**
 * @brief 重定向c库函数printf到串口，重定向后可使用printf函数
 * 
 * @param ch 
 * @param f 
 * @return int 
 */
int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到串口 */
		UART1_SendByte((uint8_t) ch);	
//		/* 等待发送完毕 */
		 while(UART_Flag);		
	
		return (ch);
}


static void uart1_gpio_init(void)
{
	
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_StructInit(&GPIO_InitStruct); //初始化结构体
//  //配置UART1_RXD  于pwm 引脚冲突因此 只使能tx
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIO0, &GPIO_InitStruct);

 // 配置UART1_TXD   
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIO0, &GPIO_InitStruct);

  GPIO_PinAFConfig(GPIO0, GPIO_PinSource_6, AF4_UART);
  GPIO_PinAFConfig(GPIO0, GPIO_PinSource_7, AF4_UART);
}
void uart1_hal_init(void)
{
  UART_InitTypeDef UART_InitStruct;
	uart1_gpio_init();
  UART_StructInit(&UART_InitStruct);
  UART_InitStruct.BaudRate =9600;                                     /* 设置波特率38400 */
  UART_InitStruct.WordLength = UART_WORDLENGTH_8b;                     /* 发送数据长度8位 */
  UART_InitStruct.StopBits = UART_STOPBITS_1b;                         /* 停止位1位 */
  UART_InitStruct.FirstSend = UART_FIRSTSEND_LSB;                      /* 先发送LSB */
  UART_InitStruct.ParityMode = UART_Parity_NO;                         /* 无奇偶校验 */
  UART_InitStruct.IRQEna = UART_IRQEna_SendOver | UART_IRQEna_RcvOver;/* 串口中断使能 */
  UART_Init(UART1, &UART_InitStruct);
  UART1_IF = 0xff;
  __disable_irq();
  NVIC_EnableIRQ(UART1_IRQn);      	//打开串口1中断
  NVIC_SetPriority(UART1_IRQn, 1); 	//中断优先级配置
  __enable_irq(); /* 开启中断 */
	UART1_SendByte(0xaa);
#ifdef UART_TEST
	uart_test();
#endif 
}


